#include "utils/token.hpp"
#include "utils/crypto.hpp"
#include <chrono>
#include <sstream>
#include <jwt-cpp/jwt.h>

// 从主密钥 + 时间因子派生当日密钥
static const std::string JWT_SECRET = "a_very_secret_key_for_this_project_12345!";

std::string Token::generate(const std::string& username) {
    auto token = jwt::create()
        .set_issuer("auth.diabio.com")   // 设置令牌的签发者(issuer)，通常是你的服务名称或域名
        .set_issued_at(std::chrono::system_clock::now())  // 设置令牌的签发时间
        .set_expires_at(std::chrono::system_clock::now() + std::chrono::minutes{30})  // 三十分钟后过期
        .set_payload_claim("username", jwt::claim(username))  // 添加自定义声明
        .sign(jwt::algorithm::hs256{JWT_SECRET});
    return token;
}


bool Token::validate(const std::string& token, const std::string& username) {
    return extractUsername(token) == username;
}


std::string Token::extractUsername(const std::string& token) {
     try {
        auto decoded = jwt::decode(token);
        auto verifer = jwt::verify()
            .allow_algorithm(jwt::algorithm::hs256{JWT_SECRET})
            .with_issuer("auth.diabio.com");

        verifer.verify(decoded);
        return decoded.get_payload_claim("username").as_string();
    } catch (...) {
        return "";
    }
}
